import os

from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

# 阿里大模型：通义千问的api-key
os.environ["DASHSCOPE_API_KEY"] = "sk-10920ad0a9d542af96353edd7ab3e613"
'''
第一步：加载markdown等文本文件
'''
from langchain_community.llms import Tongyi
# 引入加载markdown文档的工具
from langchain_community.document_loaders import UnstructuredMarkdownLoader

markdown_path = r"./README.md"
# 创建md文档的读取类（还未实际工作）
loader = UnstructuredMarkdownLoader(markdown_path)
# 实际调用读取类的方法工作
data = loader.load()
# 放行，通常增加打断点位置时使用
pass
'''
第二步：对全文进行切分
'''

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(data)

'''
第三步：对切分后的文档块（chunks）进行embedding（调用模型或接口），以备做语义相似匹配
这个embedding模型也会自动应用于对原始问题的向量化
'''
from langchain_community.embeddings import DashScopeEmbeddings

embeddings = DashScopeEmbeddings(
    model="text-embedding-v1", dashscope_api_key="sk-10920ad0a9d542af96353edd7ab3e613"
)

'''
第四步：将embedding后的向量存入向量数据库（和关系数据库有什么区别？）
'''

from langchain_community.vectorstores.chroma import Chroma

# pip install Chroma(一个轻量级本地文件数据库)
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)

'''
第五步：输入问题，查找最接近的4个chunk
'''
# Retrieve and generate using the relevant snippets of the blog.
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
prompt = hub.pull("rlm/rag-prompt")
print(prompt)
# llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
llm = Tongyi()


def format_docs(docs):
    print(docs)
    return "\n\n".join(doc.page_content for doc in docs)


rag_chain = (
        {"context": retriever | format_docs, "question": RunnablePassthrough()}
        | prompt
        | llm
        | StrOutputParser()
)

result = rag_chain.invoke("请问该平台有哪些内置功能")
print(result)
